/** 合金弹头系列

  游戏按键设定一次为:连发枪,跳,手雷

  By setycyas @2024-09-08
*/

/* 全局设定
*/ {
#Warn
#MaxThreadsPerHotkey 1
SetWorkingDir(A_ScriptDir)
#Include "..\Class\FaceDetector.2.ahk"
#Include "..\Class\CommonMacro.2.ahk"
#Include "..\Class\CommonUI.2.ahk"
#Include "..\Class\MyFuns.2.ahk"
#Include "..\Class\MyEmu.2.ahk"
#Include "..\Class\OrderMap.2.ahk"
;SendMode("Event")
SendMode("Input")
}

/* 制作合金专用的宏类
*/ class MetalSlugMacro extends CommonMacro {

  UI := "" ;显示需要的ui

  /* 构造函数,设定预设数据
  */
  __New(faceDetector, keys){
    super.__New(faceDetector, keys)
  }
  
  /* 函数
  */
  /* 新增的宏函数
  */
  ;手雷连发
  _连发C(key){
    this._连发(key, 3)
  }
  _单发枪(key){
    this._press(1)
  }
  _单发跳(key){
    this._press(2)
  }
  ;不用的好,实操只需要按住跳再拉后,面向方向就不变,开枪前要放开方向键才不会
  ;转向,所以开枪时要放开方向键,用脚本很不灵活.
  _合金后跳(key){
    local back := this._face.back()
    this._down(2)
    sleep(50)
    MyFuns.keyDown(back)
    sleep(400)
    MyFuns.keyUp(back)
    ;MyFuns.press(back, this.testParams[2])
    this._up(2)
  }
  
  ;第一个按键需要指定为连发,只有合金12x可用,3代修复了这个bug(?)
  _合金蹲站射击(key){
    static delay := 60
    local thisKey := MyFuns.getHotkey(key)
    this._down(1)
    while(MyFuns.getKeyState(thisKey)){
      MyFuns.press("down", delay)
      sleep(delay)
    }
    this._up(1)
  }
  ;5代用,从三国志2复制过来的,考虑到了已经按住下键的情况
  _下B(key){
    static downVk := GetKeyVK("down")
    if (DllCall("GetKeyState", "int", downVk) >= 0) { ;没按住下键
      MyFuns.pressKeys(["down", this._keys[2]], [50, 70])
    } else { ;已经按住下键
      this._press(2)
    }
  }
  
  ;载具跳,屏蔽开枪键保证不会自爆,如果是按住开枪跳的话,不要在跳时松开开枪键!
  ;至少半秒放开开枪键!
  _载具跳(key){
    local key1 := this._keys[1]
    if (MyFuns.getKeyState(key1)) { ;按住a键开枪的情况
      ;放开a键,按b,再重新发送按下a键消息
      this._up(1)
      sleep(30)
      MyFuns.press(this._keys[2], 300)
      sleep(30)
      ;if (!MyFuns.getKeyState(key1)) {
      this._down(1)
      ;}
      ;this.UI._statusBar.SetText("按住a键时的宏")
    } else { ; 没按住开枪的情况
      MyFuns.press(this._keys[2], 300)
      ;this.UI._statusBar.SetText("松开a键时的宏")
    }
  }
  
  /* 重载宏接口
  */
  _setMacro(){
    this.macroMap := OrderMap()
    this.macroMap["单发枪"] := this._单发枪.bind(this)
    this.macroMap["单发跳"] := this._单发跳.bind(this)
    this.macroMap["连发C"] := this._连发C.bind(this)
    this.macroMap["空函数"] := this._空函数.bind(this)
    this.macroMap["合金蹲站射击"] := this._合金蹲站射击.bind(this)
    this.macroMap["载具跳"] := this._载具跳.bind(this)
    this.macroMap["下B"] := this._下B.bind(this)
    this.macroArr := this.macroMap.getKeys()
  }
}

/* 制作合金专用UI
*/
class MetalSlugUI extends CommonUI {

  DEFAULT_HOTKEYS := "~d"
  EXE_ARRAY := [MyEmu.WINKAWAKS, "arcade64.exe", MyEmu.XZONE]

  /* 构造函数
  */
  __New(macro){
    super.__New("合金系列", macro)
    this._preset := OrderMap([
      "12x", ["合金蹲站射击", "载具跳", "空函数"],
      "3", ["单发枪", "载具跳", "空函数"],
      "45", ["单发枪", "单发跳", "下B"]
    ])
    this._macro.UI := this ;绑定UI
  }

  /* 重写接口
  */

  /* 重写setup,更改可选的exe,读入预设
  */
  setup(){
    super.setup()
    this._myGui.opt("+AlwaysOnTop")
    this._myGui.show("x1100 y330")
    this.readPresetMenu("12x")
  }

}

/* 运行当前脚本
*/ if (A_ScriptName == "合金弹头.2.ahk") {
  face := FaceDetector() ;方向检测对象
  macro := MetalSlugMacro(face, ["w","e"]) ;宏对象,有界面时第二个参数可以随便写但长度不要小于2
  ;新建界面对象并显示
  ui := MetalSlugUI(macro)
  ui.setup()
  ;更新组件内容
  ui._exeComboBox.Choose(MyEmu.WINKAWAKS)
  ;ui._exeComboBox.Choose("arcade64.exe")
  ;ui._gameKeyEdit.Text := "q,d,x"
  ui._gameKeyEdit.Text := "s,d,x" 
  ui._hotkeyEdit.Text := "~w,~e,~f"
  ui._fpsEdit.Text := "20"
  ui._testEdit.Text := "30,30,300,2100"
  ui.readPresetMenu("12x")
}
